Various data communication infrastructures have been developed that enable a process or method to have requests processed by input/output (IO) devices. In such an infrastructure, for example, a client submits a request to a process operating in user-mode. The user-mode process submits a file retrieve command to a kernel-mode file server process. After receiving the file retrieve command, the kernel-mode file server process copies the file identified in the file retrieve command to a buffer in non-cache user addressable RAM. The kernel-mode file server process then informs the user-mode process of the completed file copy to the buffer. The user-mode process makes a separate system call to a transport protocol invoking a data transmit procedure for transmitting the buffered file to an identified destination, such as an IO device. The buffered file is then transmitted via the transport protocol.
At no time in such an infrastructure does the user-mode application or process that issued the request have direct access to hardware destinations. Instead, the operating system, operating in kernel mode, acts as an intermediary issuing the requests to the hardware via a corresponding communications protocol. As a result, IO requests and other interprocess communication usually involve a lengthy kernel code path to reach their intended destination, which imposes an undesirable delay.
Consequently, existing infrastructures have failed to adequately keep pace with computer evolution and the increased burden imposed on data servers, application processing, and enterprise computing created by the popular success of the Internet. In particular, high-end computing concepts such as clustering, fail-safe, and 24×7 availability demand greater capacity to move data between processing nodes as well as between a processor node and IO devices. These concepts usually require higher bandwidth and lower latencies, as they tend to push more functionality down to the IO device. Such concepts also demand greater protection, higher isolation, deterministic behavior, and a higher quality of service than conventionally available.
As a result, new architectures are being developed in which a user-level application or process may directly access hardware, such as to issue IO requests. However, by permitting an application or process direct access to hardware, issues may exist that (if not properly addressed) could compromise system integrity and/or performance.
By way of example, a data communication model has been developed in which a process operating in user mode is operable to employ a data transport service in which communication between associated hardware components is facilitated through communication contexts. The process first creates a queue pair and sets it to the appropriate type of service. The process obtains an endpoint communication context through a privileged operation, which can communicate with a given remote node address.
This model, however, does not enable the desired service type to be utilized with every application or process. In fact, if appropriate measures are not taken, it would be easier for a user-level process to potentially “starve” use of the same communication context by another process or kernel. This can be done for example by sending very large data transfers using that communication context. The current architecture does not provide a mechanism to control how many or which queue pairs are using a given communication context. This kind of a performance problem is not acceptable in a robust system, especially if one of the processes using the communication context is the operating system itself.
Therefore, it is desirable to provide a system and method to isolate communication contexts to facilitate communication of data.